跳到主要内容

配置 HTTPS 的 SSL 证书

SSL 证书

什么是 SSL 证书

SSL 证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为 SSL 服务器证书。SSL 证书就是遵守 SSL 协议,由受信任的数字证书颁发机构 CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。

Secure socket layer(SSL)安全协议是由 Netscape Communication 公司设计开发。该安全协议主要用来提供对用户和服务器的认证;对传送的数据进行加密和隐藏;确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准。由于 SSL 技术已建立到所有主要的浏览器和 WEB 服务器程序中,因此,仅需安装服务器证书就可以激活该功能了

SSL 证书通过在客户端浏览器和 Web 服务器之间建立一条 SSL 安全通道,即通过它可以激活SSL协议,实现数据信息在客户端和服务器之间的加密传输,可以防止数据信息的泄露,保证了双方传递信息的安全性,而且用户可以通过服务器证书验证他所访问的网站是否是真实可靠。

提示

key 通常指私钥

CSR 是 Certificate Signing Request 的缩写,即证书签名申请,这不是证书,这是要求 CA 给证书签名的一种正是申请,该申请包含申请证书的实体的公钥及该实体店某些信息。该数据将成为证书的一部分。CSR 始终使用它携带的公钥所对应的私钥进行签名。(这个是直接生成的)

CRT 即 certificate的缩写,即证书

SSL 证书的分类

SSL证书又分 域名型SSL证书(DV SSL),企业型SSL证书(OV SSL),增强型SSL证书(EV SSL)

域名型SSL证书(DV SSL):只验证网站域名所有权的简易型SSL证书,此类证书仅能起到网站机密信息加密的作用,无法向用户证明网站的真实身份。适用于个人网站、小型组织或企业网站、各类加密应用(如数据库和即时通讯协议等)。

企业型 SSL 证书(OV SSL):需要验证网站所有单位的真实身份的标准型SSL证书,需要购买者提交组织机构资料和单位授权信等在官方注册的凭证,不仅能起到网站机密信息加密的作用,而且能向用户证明网站的真实身份。所以,推荐在所有电子商务网站使用,因为电子商务需要的是在线信任和在线安全。

增强型 SSL 证书(EV SSL):同样是基于SSL/TLS安全协议,都是用于网站的身份验证和信息在网上的传输加密,但验证流程更加具体详细,验证步骤更多,证书所绑定的网站就更加的可靠,可信,它跟普通SSL证书的区别也是明显的,证书上面会显示更多的信息,不仅仅是网站所属单位信息,还有公司地址等等;部署证书后,用户打开网站时,浏览器地址栏会显示绿色,在地址栏还会显示网站所属单位的名称,特别适合金融、保险、p2p、电商、网上支付等等行业。

对比域名型SSL (DVSSL)企业型SSL (OVSSL)增强型SSL (EVSSL)
英文名称Domain Validation SSL CertificateOrganization Validation SSL CertificateExtended Validation SSL Certificate
审核内容域名管理权限域名管理权限;企业名称、地址、电话等信息的真实性;域名管理权限;企业名称、地址、电话等信息的真实性;第三方数据库审查,例如邓白氏、114查号台、律师证明信等。
颁发周期几分钟-几小时3-5个工作日5-7个工作日
赔付保障金10-50万美金50-150万美金150-1750万美金
浏览器地址栏https + 小锁标志https + 小锁标志https 小锁标志 + 绿色地址栏 + 公司名字直显在浏览器地址栏
证书详情使用者身份只显示某某域名使用者身份显示公司名称使用者身份显示公司名称
一般用途个人站点; iOS应用分发下载;登录等单纯 https 加密需求的链接企业网站企业官网、电商、P2P 等互联网金融网站

购买地址

可以直接在阿里云里申请免费的 SSL

怎么使用 SSL 就不细说了,大把教程

certbot 去申请免费的证书

安装 certbot

参考资料 快速入门

因为最近发现服务器的图床不使用 https 根本无法在 GitHub这些地方引用,所以乘此机会把全站都升级为 https 一劳永逸

首先在 certbot 里面选择自己的系统

然后按着下面给的命令,先安装这个 snapd 包管理器(有些是自带的)

apt-get install snapd

然后检查它的版本是否是最新的

sudo snap install core; sudo snap refresh core

避免冲突,先删除全部的 certbot 包,没有这个命令就下一步

certbot, sudo dnf remove certbot, or sudo yum remove certbot.

安装这个 certbot

sudo snap install --classic certbot

输入以下命令确保能运行(不报错就可以了)

sudo ln -s /snap/bin/certbot /usr/bin/certbot

继续使用官网的命令

sudo certbot --nginx

运行此命令会自动获取证书,并且 Certbot 会自动编辑 Nginx 配置文件配置 HTTPS 服务。

然后它会让你选择需要部署的哪些子域名(Nginx 上已有的),回车表示全部子域名

最后别忘了

nginx -s reload

如果出现 DNS 错误,可以在这个网站上输入自己的域名 CHECK DNS PROPAGATION 检查一次,然后再重新上面那条命令就好了(可能是 DNS 缓存的问题)

如果出现找不到模块的问题参考这里 :通过 Certbot 安装 Let's Encrypt 证书,来实现全站的 HTTPS 访问

下面是手动申请的过程(上面完成的可以直接跳过手动申请)

设置一下 Nginx

配置一个 nginx 站点

mkdir /opt/www/demo.mydomain.com -p
chown nginx:nginx /opt/www/demo.mydomain.com/ -R
vi /etc/nginx/conf.d/demo.mydomain.com.conf

将以下内容复制到该文件中

server {
listen 80;
server_name demo.mydomain.com;
charset utf-8;

root /opt/www/demo.mydomain.com;
index index.html index.htm;

access_log /var/log/nginx/demo.mydomain.com_access.log;
error_log /var/log/nginx/demo.mydomain.com_error.log;
}

certbot 申请证书

使用 certbot 命令初次申请证书

# 使用方法:certbot certonly --webroot -w [Web站点目录] -d [站点域名] -m [联系人email地址] --agree-tos
# 例如:
certbot certonly --webroot -w /opt/www/demo.mydomain.com -d demo.mydomain.com -m mydomain@gmail.com --agree-tos

注意:联系人 email 地址要填写真实有效的,letsencrypt 会在证书在过期以前发送预告的通知邮件。 申请成功后,会显示以下 Congratulations 信息

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/[xxx.xxx.xxx]/fullchain.pem. Your cert will
expire on 2017-03-20. To obtain a new or tweaked version of this
certificate in the future, simply run certbot again. To
non-interactively renew *all* of your certificates, run "certbot
renew"
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

证书的保存位置在:

/etc/letsencrypt/live/demo.mydomain.com/

自动定时申请更新证书

默认 certbot 就自带自动更新证书功能了,可以使用下面命令手动更新

测试自动更新

#自动更新测试
# 使用 --dry-run 选项表示测试,非真正执行更新
sudo certbot renew --dry-run

若显示如下字样,则表示自动更新功能测试成功

由于 Let's Encrypt 颁发的证书只有 90 天有效期,因此需要定期进行证书更新

如果要手动更新:

# 手动更新
sudo certbot renew -v

再次查看证书(浏览器)可以看到到期时间已经更新了

弃用证书

可以通过如下命令将指定的域名删除

certbot delete --cert-name example.com

使用 acme.sh 取得 SSL 证书

acme.sh 是一个基于 Shell 脚本编写的开源项目,用于获取 SSL/TLS 证书,可以实现自动申请、续签、安装证书,让网站实现 https 访问

首先安裝 acme.sh

$ curl https://get.acme.sh | sh

安装完成的时候,程序就会自动将 acme.sh 这个程序加入到 crontab 里面并且设定为每日执行,来每天进行检查若证书效期达60天,则会自动启动自动更新凭证的动作。

默认会安装在 /家目录/.acme.sh/ 底下

常用命令

# 列出申请的证书
$ acme.sh --list

# 升级 acme.sh 到最新版:
$ acme.sh --upgrade
# 如果你不想手动升级, 可以开启自动升级:
$ acme.sh --upgrade --auto-upgrade

使用 DNS 颁发证书

在给域名申请证书时,Let's encrypt 需要先验证你有对域名的控制权。这个验证方式有2种:文件验证和 DNS 验证。

提示

文件验证的原理是在你的网站下面放一个验证文件 /.well-known/acme-challenge/目录下,certbot 通过域名直接访问到这个验证文件,能访问到说明是你的网站,也就可以申请证书。

DNS 验证的原理是你需要创建一条 TXT 的记录,设置指定值,certbot 检查到这条记录就完成验证

这种方式的好处是,你不需要任何服务器,不需要任何公网 IP,只需要 DNS 的解析记录即可完成验证。

# 首先颁发一个证书
$ acme.sh --issue --dns -d mydomain.com

然后,acme.sh 会生成相应的解析记录显示出来,只需要在你的域名管理面板中添加这条 txt 记录即可

但是 DNS 方式的真正强大之处在于可以使用域名解析商提供的 API 自动添加 txt 记录完成验证,并且颁发证书,acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成。

以阿里云或者腾讯云为例

# 阿里云
$ export DP_Id = "1234"
$ export DP_Key = "sADDsdasdgdsf"
$ acme.sh acme.sh --issue --dns dns_ali -d example.com -d www.example.com

# 腾讯云
export DP_Id="138xxx"
export DP_Key="7a94xxxxxxxxe78b43f99xxx"
$ acme.sh --issue -d mydomain2.com --dns dns_dp

证书就会自动生成了,这里给出的 DP_Id 和 DP_Key 会被自动记录下来,将来你在使用 Ali API 的时候,就不需要再次指定了。

注意!!如果要重新生成则需要先删除对应的域名文件夹

更新证书

证书的有效期为 90 天,acme.sh 会 60 天更新(Renew)一次。

在安装 acme.sh 的时候就自动配置了一条 cron 任务了,会每天检查证书的情况。当然可以到 crontab 里看一下。

$ crontab -e # 编辑 crontab
$ crontab -l
52 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh/*.alsritter.icu_ecc" >> alsritter-acme.log 2>&1

手动更新(强制更新)

acme.sh --renew -d example.com --force
acme.sh --renew -d example.com --force --ecc # 如果用的是ECC证书

泛域名配置

只适用于 DNS 验证的方式

# 阿里云验证 DNS 域名
./acme.sh acme.sh --issue --dns dns_ali -d *.example.com

# 更新证书
./acme.sh --renew -d example.com -d www.example.com

更换 CA 机构

./acme.sh --set-default-ca --server zerossl

使用 ZeroSSL 需要注册:

# 使用文档 https://github.com/acmesh-official/acme.sh/wiki/ZeroSSL.com-CA

# 进文档取得 key https://app.zerossl.com/developer
./acme.sh --register-account --server zerossl \
--eab-kid xxxxxxxxxxx \
--eab-hmac-key xxxxxxxxxxx

自动上传阿里云

使用 cdn-auto-cert 项目

References